package com.equipment;

import java.util.NoSuchElementException;
import android.annotation.SuppressLint;
import com.util.EncodingUtil;

/**
 * 卡片命令通道 DFB2
 *
 * @version 1.18
 * @author 刘亚东
 */
@SuppressLint("DefaultLocale")
public class CardCommandChannelResponse {

	@Override
	public String toString() {
		return stx + rsctl + code + subCode + bcc + "内容：" + PsamNum + status
				+ PsamCmdRsLen + PsamCmdRsData;

	}

	// 帧开始标记
	private String stx = "55AA";
	// 串口帧序列号
	private String rsctl = "00";
	// 长度
	private String Length = "";
	// 代码类型
	private String code = "DF";
	// 拓展子码
	private String subCode = "B2";
	// 异或校验值
	private String bcc = "";
	// 0：设置成功，非0异常（ PSAMDATA不存在）
	private String status = "";
	// PSAM卡号（1~4），接触式大卡号 0，非接触卡号0xff
	private String PsamNum = "";
	// 数据长度
	private String PsamCmdRsLen = "";
	// PSAM回复的数据最后两个字节为SW，如果PSAM返回61XX，底层自动取响应
	private String PsamCmdRsData = "";

	/**
	 * 解析B2指令
	 *
	 * @param context
	 * @return
	 */
	public CardCommandChannelResponse analysis(String context)
			throws NoSuchElementException {
		CardCommandChannelResponse cr = null;
		try {
			// 判断是否是B2指令55AA070006DFB20002029000FC
			if (!context.substring(12, 14).toUpperCase().equals("B2")) {
				throw new NoSuchElementException("非B2指令");
			}

			// 判断状态是否成功
			if (!context.substring(14, 16).equals("00")) {
				throw new NoSuchElementException("状态非0");
			}
			// 判断内容返回是否正确 非9000不正确
			if (!context.substring(context.length() - 6, context.length() - 2)
					.equals("9000")) {
				throw new NoSuchElementException("SW返回错误"
						+ context.substring(context.length() - 6,
						context.length() - 2));
			}
			// 截取到bcc校验值 需要判断校验是否相等
			bcc = context.substring(context.length() - 2);
			// 截取到发送的数据(总长度-2个字节计算到数据的最后位置)并转换下FE和FF
			String str = context.substring(4, context.length() - 2);
			// 得到比对校验
			String bc = EncodingUtil.yihuo(EncodingUtil.change(str)).toUpperCase();
			// 判断校验是否一致
			if (!bc.equals(bcc)) {
				throw new NoSuchElementException("校验失败");
			}
			cr = new CardCommandChannelResponse();
			// 解析串口帧序列号
			cr.setRsctl(context.substring(4, 6));
			// 解析长度
			cr.setLength(context.substring(6, 10));
			// 解析代码类型
			cr.setCode(context.substring(10, 12));

			// 解析拓展子代码
			cr.setSubCode(context.substring(12, 14));

			// 截取状态
			cr.setStatus(context.substring(14, 16));

			// 截取PSAM卡号
			cr.setPsamNum(context.substring(16, 18));

			// 截取数据长度
			cr.setPsamCmdRsLen(context.substring(18, 20));

			// 截取数据  55AA02000EDFB200020A53E27EAD4C72F9C390009F
			cr.setPsamCmdRsData(context.substring(20, context.length() - 4));
		} catch (Exception e) {
			throw new NoSuchElementException(e.getMessage());
		}

		return cr;
	}

	public String getStx() {
		return stx;
	}

	public void setStx(String stx) {
		this.stx = stx;
	}

	public String getRsctl() {
		return rsctl;
	}

	public void setRsctl(String rsctl) {
		this.rsctl = rsctl;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getSubCode() {
		return subCode;
	}

	public void setSubCode(String subCode) {
		this.subCode = subCode;
	}

	public String getBcc() {
		return bcc;
	}

	public void setBcc(String bcc) {
		this.bcc = bcc;
	}

	public String getPsamNum() {
		return PsamNum;
	}

	public void setPsamNum(String psamNum) {
		PsamNum = psamNum;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getPsamCmdRsLen() {
		return PsamCmdRsLen;
	}

	public void setPsamCmdRsLen(String psamCmdRsLen) {
		PsamCmdRsLen = psamCmdRsLen;
	}

	public String getPsamCmdRsData() {
		return PsamCmdRsData;
	}

	public void setPsamCmdRsData(String psamCmdRsData) {
		PsamCmdRsData = psamCmdRsData;
	}

	public String getLength() {
		return Length;
	}

	public void setLength(String length) {
		Length = length;
	}

}
